#include <stdlib.h>
#include <stdio.h>
#include <string.h>


typedef unsigned int uint; //Un uint comporte 32 bits, ce qui correspond à la longueur de notre "clair connu"


//------------------------------------------------PROTOTYPES--------------------------------------------------------

//Renvoie le bit n°i d'un char. La position 0 correspond au bit de poids fort (celui de gauche)
int bit(char a, int i);

//Renvoie le bit n°i d'un uint. La position 0 correspond au bit de poids fort (celui de gauche)
int ubit(uint a, int i);

//Renvoie le bit n°i de a,qui est une suite de 0 et de 1 stockée dans un tableau de nb uints
int Nbit(uint* a, int nb, int i);

//Affiche tous les bits d'un char
void affiche(char a);

//Affiche tous les bits d'un uint
void uaffiche(uint a);

//Affiche les N premiers bits de a, qui est une suite de 0 et de 1 stockée dans un tableau de nb uints
void Naffiche(uint* a, int nb, int N);

//Met à 0 le bit n°i d'un char 
void zero(char* a, int i);

//Met à 0 le bit n°i d'un uint 
void uzero(uint* a, int i);

//Met à 1 le bit n°i d'un char 
void un(char* a, int i);

//Met à 1 le bit n°i d'un uint 
void uun(uint* a, int i);

//Met à val (0 ou 1) le bit n°i de a, qui est une suite de 0 et de 1 stockée dans un tableau de nb uints 
void setBit(uint* a, int nb, int i, int val);

//str est une chaine de 8 caractères (des '0' et des '1'). Les bits du char à l'adresse a sont remplacés par les valeurs de str
void edit(char* a, char* str);

/*str est une chaine de 32 caractères (des '0' et des '1'). Les premiers bits du uint à l'adresse a sont remplacés
 * par les valeurs de str. Les suivants sont mis à 0
 */
void uedit(uint* a, char* str);

/*a est un tableau de nb uints. Les bits de ce tableau prennent les valeurs de str*/
void Nedit(uint* a, int nb, char* str);

/*Crée un tableau de uints à l'adresse a pour stocker les bits de la chaîne str
 * et renvoie la taille de ce tableau. Les derniers bits du dernier uint du tableau sont mis à 0.
 */
int Nstore(uint** adresse, char* str);

/*Crée un tableau de uints à l'adresse a pour stocker sous forme de bits le contenu du fichier binaire f
 * et renvoie la taille de ce tableau. Les derniers bits du dernier uint du tableau sont mis à 0.
 */
int NfileStore(FILE* f, uint** adresse);

//Renvoie le XOR des bits d'un uint (entre eux)
int uXOR(uint a);

//Renvoie le XOR des bits d'un tableau de nb uints (entre eux)
int NXOR(uint* a, int nb);

uint retourne(uint a, int n);
/* Renvoie, dans l'ordre inverse, les n premiers bits de a, avec n <= 32
 * 
 * ex : a = 00010011100110000000000000000000
 *      n = 15
 * 
 * 	La fonction renvoie : 001100111001000 suivi de (32-15) zeros
 */

uint* Nretourne(uint* a, int nb, int n);
// Renvoie, dans l'ordre inverse, les n premiers bits du tableau a 

void Ndroite(uint* a, int nb);
/*Décale d'un cran vers la droite tous les bits de a, qui est une suite
 * de 0 et de 1 stockée dans un tableau de nb uints
 */

void Ngauche(uint* a, int nb);
/*Décale d'un cran vers la gauche tous les bits de a, qui est une suite
 * de 0 et de 1 stockée dans un tableau de nb uints
 */

//Calcule le nombre de uints nécessaires pour stocker nbBits bits
int Ntaille(int nbBits);



